package preguntas;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Properties;
import java.util.Random;
import utilidades.FileUtilities;
import utilidades.PropertiesFile;
import java.util.logging.Level;
import java.util.logging.Logger;

public class PreguntaMonticuloMaximo {

	/**
	 * @param args
	 * @throws IOException 
	 * @throws FileNotFoundException 
	 */
	public static void main(String[] args) throws FileNotFoundException, IOException {
		
		Random rnd = new Random();
		
		ArrayList<Character>heap= new ArrayList<Character>();
		ArrayList<Character>enunciado= new ArrayList<Character>();
		ArrayList<Character>aux= new ArrayList<Character>();
		
		Properties properties = new PropertiesFile().getProperties();
		
		int seed;
		int seedProperty;
		int heapSize;
		int extractionsNumber;
		int numberOfResult=0;
		
		char letter='A';
		
		String property;
		String feedBack="";
		String xmlFormat="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n ";
		String giftFormat="";
		String question="";
		
		String filenameXml="Preguntas/Monticulos/PreguntaMonticuloXml.xml";
		String filenameGift="Preguntas/Monticulos/PreguntaMonticuloGift.txt";
		
		
		File fileXml=FileUtilities.createFile(filenameXml);
		File fileGift=FileUtilities.createFile(filenameGift);
		
		xmlFormat=xmlFormat+"<quiz>\r\n\t <question type=\"category\">\r\n\t <category>\r\n\t <text>Estructura de datos</text>\r\n </category>\r\n </question>";
		
		
		property=properties.getProperty("heapSize");
		heapSize=Integer.parseInt(property);
		
		property=properties.getProperty("extractionsNumber");
		extractionsNumber=Integer.parseInt(property);
		
		property=properties.getProperty("seedHeap");
		seedProperty=Integer.parseInt(property);
		
		numberOfResult=heapSize-extractionsNumber;
		 if(seedProperty==-1)
			 seed= (int) java.lang.Math.round(Math.random()*999999999+0);
		 else
			 seed=seedProperty;
		 rnd.setSeed(seed);
		 
		 xmlFormat=xmlFormat+" <question type=\"cloze\"> \r\n\t <name> \r\n\t <text>pregunta Monticulo Maximo con seed="+seed +"</text>\r\n</name> \r\n<questiontext format=\"html\">\r\n\t <text>\r\n\t ";
		 giftFormat=giftFormat+"::Pregunta Monticulo seed="+seed +"::\r\n";
			

				
	
		
		
		 for(int i=0;i<26;i++)
			 aux.add(i,(char) (letter+i));
			
		 	
		 Collections.shuffle(aux, rnd);
		 
	
		 xmlFormat=xmlFormat+" <![CDATA[<p>Proporcione la secuencia de "+numberOfResult+" claves que resultan después de realizar "+extractionsNumber +" operaciones de extraer el máximo sobre el siguiente montículo (de máximos) ";
		 giftFormat=giftFormat+"Proporcione la secuencia de "+numberOfResult+" claves que resultan después de realizar "+extractionsNumber +" operaciones de extraer el máximo sobre el siguiente montículo (de máximos)";
		 question=question+"Proporcione la secuencia de "+numberOfResult+" claves que resultan después de realizar "+extractionsNumber +" operaciones de extraer el máximo sobre el siguiente montículo (de máximos)\n";
		
		 for(int i=0;i<heapSize;i++)
			 enunciado.add(i, aux.get(i));
		 
		 for(int i=0;i<heapSize;i++)
			 heap.add(i, enunciado.get(i));
		 
		 for(int i=heap.size()-1;i>0;i--)
			heap=restructurar(heap,i);
		 
		 
		 
		 for(int i=0;i<heapSize;i++)
		 {
			 xmlFormat=xmlFormat+" "+heap.get(i);
			 giftFormat=giftFormat+" "+heap.get(i);
			 question=question +" "+heap.get(i);
		 }
		 giftFormat=giftFormat+"{\r\n ";
		 xmlFormat=xmlFormat+" </p> ";
		 question=question +"\nLa respuesta Correcta es:";
		 

		 
		for(int i=0;i<extractionsNumber;i++)
			heap=extraccion(heap);
		
		 xmlFormat=xmlFormat+"<p> ";
		 giftFormat=giftFormat+"=%100%";
		 for (int i=0;i<numberOfResult;i++)
		 {
			 xmlFormat=xmlFormat+"{1:MULTICHOICE:";
			 giftFormat=giftFormat+heap.get(i)+" ";
			 feedBack="El resultado correcto es la letra "+heap.get(i);
			 question=question+" "+heap.get(i);
			 for(int j=0;j<enunciado.size();j++)
			 {
				 if(j==0)
				 {
					 if(enunciado.get(j)!=heap.get(i))
						 xmlFormat=xmlFormat+"~";
					 else
						 xmlFormat=xmlFormat+"=";
				 }
				 else
				 {
					 xmlFormat=xmlFormat+"~";
					 if(enunciado.get(j)==heap.get(i))
						 xmlFormat=xmlFormat+"=";
				 }
				
				 xmlFormat=xmlFormat+enunciado.get(j)+"#"+feedBack;
				 
			 }
			 xmlFormat=xmlFormat+"} ";

		 }
		 xmlFormat=xmlFormat+" </p> </p>]]>\r\n</text> \r\n </questiontext>\r\n <generalfeedback format=\"html\"> \r\n\t <text/> \r\n</generalfeedback>\r\n </question>\r\n	</quiz>\r\n";
		 giftFormat=giftFormat+"\r\n}";
		

		FileUtilities.writeFile(fileXml, xmlFormat); 
		FileUtilities.writeFile(fileGift, giftFormat);
		Logger.getLogger("logger").log(Level.INFO,question+"\n"); 
	}
	
	public static ArrayList<Character> restructurar(ArrayList<Character>heap,int pivot)
	{
		
		int aux=heap.size();
		int auxPadre;
		int aux_hijo1,aux_hijo2;
		int maxHijo=0;
		boolean salir=false;
		
		
			auxPadre = (pivot-1)/2;
			
			salir=false;
			while(!salir)
			{
				aux_hijo1=(auxPadre*2)+1;
				aux_hijo2=(auxPadre*2)+2;
				
				if(aux>=aux_hijo2)
				{
					
					if(aux>aux_hijo2)
					{
						if(heap.get(aux_hijo1)>heap.get(aux_hijo2))
						{
							maxHijo=aux_hijo1;
						}
						else
						{
							maxHijo=aux_hijo2;
						}
							
					}
					
					else
					{
						maxHijo=aux_hijo1;
					}
					if(heap.get(auxPadre)<heap.get(maxHijo))
					{
						intercambiar(auxPadre,maxHijo,heap);
						auxPadre=maxHijo;
						aux=heap.size();
						
					}
					else
						salir=true;
				}
				else
					salir=true;
				
			}
		return heap;
	}
	private static void intercambiar(int i, int k,ArrayList<Character> heap){
		char aux = heap.get(i);
		heap.set(i,heap.get(k));
		heap.set(k,aux);
		
	}
	
	public static ArrayList<Character> extraccion(ArrayList<Character>heap)
	{
		char aux;
		aux=heap.get(heap.size()-1);
		heap.set(heap.size()-1, heap.get(0));
		heap.set(0, aux);
		heap.remove(heap.size()-1);
		
		for(int i=heap.size()-1;i>0;i--) 
			heap=restructurar(heap,i);

		return heap;
	}
}
